AWS CLI で Lambda function URLs を作成してみた
はじめに
アノテーション株式会社の hato です。
2022年4月頃のアップデートですが Lambda に HTTPS エンドポイントを追加する機能(Function URLs)が追加されました。
今回は、この Function URLs が有効なLambda 関数を AWS CLI で作成します。
やってみた
手順
- Lambda 関数用の実行ロール作成
- Lambda 関数の作成
- Function URLs の追加
- テスト
1. Lambda 関数用の実行ロール作成
CloudWatch Logs にログを出力する許可ポリシーを含む実行ロールを作成します。
create-roleコマンドで、まず IAM ロールを作成します。
※2行目は任意のロール名に修正してください。
$ aws iam create-role \ --role-name 【ロール名】 \ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' { "Role": { "Path": "/", "RoleName": "hato-lambda-url-role", "RoleId": "AROAABCDRFGHI", "Arn": "arn:aws:iam::123456789012:role/hato-lambda-url-role", "CreateDate": "2023-03-31T01:02:03+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }
attach-role-policyコマンドで、ログを CloudWatch にアップロードする許可が含まれるAWSLambdaBasicExecutionRole
ポリシーをロールに付与します。
※2行目は先ほど指定したロール名に修正してください。
$ aws iam attach-role-policy \ --role-name 【ロール名】 \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole $
2. Lambda 関数の作成
パラメータで渡された二つの数値の掛け算の結果を返すサンプルの Lambda 関数を作成します。
エディタで次のサンプルコード(ファイル名:index.js
)を作成します。
exports.handler = async (event) => { let body = JSON.parse(event.body) const product = body.num1 * body.num2; const response = { statusCode: 200, body: "The product of " + body.num1 + " and " + body.num2 + " is " + product, }; return response; };
ZIP圧縮してデプロイパッケージを作成します。
$ zip function.zip index.js adding: index.js (deflated 40%)
create-functionコマンドで Lambda 関数を作成します。
※2行目は任意の Lambda 関数名に修正してください。
※6行目は「create-role」した際の結果に含まれるArn
に修正してください。
$ aws lambda create-function \ --function-name 【Lambda 関数名】 \ --runtime nodejs14.x \ --zip-file fileb://function.zip \ --handler index.handler \ --role 【ロール ARN】 { "FunctionName": "hato-url-function", "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function", "Runtime": "nodejs14.x", "Role": "arn:aws:iam::123456789012:role/hato-lambda-url-role", "Handler": "index.handler", "CodeSize": 337, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2023-03-31T01:02:03.000+0000", "CodeSha256": "1ZRgJnUnhUNvQG62nALNZmWAp7ZWXC1yih1R6IlPlgA=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "24af42e7-ffd6-474d-a551-6c8587122ca5", "State": "Pending", "StateReason": "The function is being created.", "StateReasonCode": "Creating", "PackageType": "Zip", "Architectures": [ "x86_64" ], "EphemeralStorage": { "Size": 512 }, "SnapStart": { "ApplyOn": "None", "OptimizationStatus": "Off" }, "RuntimeVersionConfig": { "RuntimeVersionArn": "arn:aws:lambda:ap-northeast-1::runtime:be6b7a67cb4533b2e602f284c4e41058155b081b5879c71929b33e71c124b81d" } }
3. Function URLs の追加
作成した Lambda 関数に Function URLs を追加します。
今回は認証が不要な設定で作成します。(function-url-auth-type
を変更すると IAM による認証が追加できます)
add-permissionコマンドでリソースベースのポリシーを追加します。なお、AWS マネジメントコンソールから Function URLs を追加する場合は、自動的にリソースベースのポリシーも追加されます。
※2行目は指定した Lambda 関数名に修正してください。
$ aws lambda add-permission \ --function-name 【Lambda 関数名】 \ --action lambda:InvokeFunctionUrl \ --principal "*" \ --function-url-auth-type "NONE" \ --statement-id url { "Statement": "{\"Sid\":\"url\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:InvokeFunctionUrl\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function\",\"Condition\":{\"StringEquals\":{\"lambda:FunctionUrlAuthType\":\"NONE\"}}}" }
create-function-url-configコマンドで Function URLs を追加します。
結果のFunctionUrl
に含まれる URL が発行されたエンドポイントです。
※2行目は指定した Lambda 関数名に修正してください。
$ aws lambda create-function-url-config \ --function-name 【Lambda 関数名】 \ --auth-type NONE { "FunctionUrl": "https://abcdefg.lambda-url.ap-northeast-1.on.aws/", "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function", "AuthType": "NONE", "CreationTime": "2023-03-31T01:02:03.000000Z" }
4. テスト
curl コマンドを使用して10x10の結果をリクエストすると、結果が返却されます。
※2行目は「create-function-url-config」した際の結果に含まれるFunctionUrl
に修正してください。
$ curl -X POST \ '【FunctionUrl】' \ -H 'Content-Type: application/json' \ -d '{"num1": "10", "num2": "10"}' The product of 10 and 10 is 100
なお、リソースベースのポリシー追加を忘れていると{"Message":"Forbidden"}
が返却されます。
$ curl -X POST \ 'https://abcdefg.lambda-url.ap-northeast-1.on.aws/' \ -H 'Content-Type: application/json' \ -d '{"num1": "10", "num2": "10"}' {"Message":"Forbidden"}
その他のコマンド
エンドポイントの URL を忘れた場合や設定を確認したい場合は、list-function-url-configsコマンドから確認できます。
※2行目は指定した Lambda 関数名に修正してください。
$ aws lambda list-function-url-configs \ --function-name 【Lambda 関数名】 { "FunctionUrlConfigs": [ { "FunctionUrl": "https://abcdefg.lambda-url.ap-northeast-1.on.aws/", "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato-url-function", "CreationTime": "2023-03-31T01:02:03.000000Z", "LastModifiedTime": "2023-03-31T01:02:03.000000Z", "AuthType": "NONE" } ] }
Function URLs を削除したい場合は、 delete-function-url-configコマンドから削除できます。削除の際は必要に応じてremove-permissionコマンドでリソースベースのポリシー削除もお忘れなく。
※2行目は指定した Lambda 関数名に修正してください。
$ aws lambda delete-function-url-config \ --function-name 【Lambda 関数名】 $
※2行目は指定した Lambda 関数名に修正してください。
$ aws lambda remove-permission \ --function-name 【Lambda 関数名】 \ --statement-id url
最後に
この記事が誰かのお役にたてば幸いです。
参考資料
- Lambda 関数 URL - AWS Lambda
- Lambda 関数 URL の作成と管理 - AWS Lambda
- Lambda 関数 URL におけるセキュリティと認証モデル - AWS Lambda
- チュートリアル: 関数 URL を使用する Lambda 関数の作成 - AWS Lambda
- Lambda 実行ロール - AWS Lambda
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。